#include <iostream>
#include <cstdio>

using namespace std;

const int N = 20;

//1.定义方向向量
//2.根据规则结合方向向量填数
//1)朝一个方向走，一边走一遍填数，直到越界
//2)越界之后，结合方向向量，重新计算出新的坐标以及方向

// 定义 右，下，左，上 四个方向
int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};
int arr[N][N];

int main()
{
	int n; cin >> n;

	// 模拟填数的过程
	int x = 1, y = 1; // 初始位置
	int pos = 0; // 当前的方向

	for(int i = 1; i <= n * n; i++)// 当前位置要填的数
	{
		arr[x][y] = i;

		//计算下一个位置
		int a = x + dx[pos]; int b = y + dy[pos];

		//判断是否越界
		if(a > n || b > n || a < 1 || b < 1 || arr[a][b]) 
		{
			// 更新出正确的该走的位置
			pos = (pos + 1) % 4;
			a = x + dx[pos]; b = y + dy[pos];
		}

		x = a; y = b;
	}

	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= n; j++)
		{
			printf("%3d", arr[i][j]);
		}
		cout << endl;
	}

	return 0;
}

